home *** CD-ROM | disk | FTP | other *** search
/ FM Towns: Free Software Collection 11 / FM Towns Free Software Collection 11.iso / t_os / tool / ein / wizme / src / wiz_mem.c < prev   
Encoding:
C/C++ Source or Header  |  1995-08-17  |  19.2 KB  |  814 lines

  1. /*<Header>==============================================================
  2. *
  3. *    WIZME / "WIZ_MEM.C"    WIZリンクソフト / メモリ管理ブロック
  4. *
  5. *        [ EIN(tm) project : サンプルプログラム ]
  6. *
  7. *    COPYRIGHT  Nam  1995, All rights reserved.
  8. *
  9. *    配付・組込・改変・商利用すべて自由。ただし無保証っす
  10. *
  11. *-----------------------------------------------------------------------
  12. *    V1.0L01α    95.08.04/Nam    プロトタイプ(『鉄鍋のジャン』2巻発売記念)
  13. *    V1.0L02α    95.08.08/Nam    CSVメモ→テキスト変換
  14. *    V1.0L02β    95.08.10/Nam    Zaurus特殊文字(2バイト半角)コンバート
  15. *    V1.0L02γ    95.08.17/Nam    Zaurus特殊文字コンバートのdebug(ひえ~)
  16. *</Header>==============================================================*/
  17. #include    <stdio.h>
  18. #include    <stdlib.h>
  19. #include    <string.h>
  20. #include    <snd.h>
  21. #include    <winb.h>
  22. #include    <te.h>
  23. #include    <fntb.h>
  24. #include    <gui.h>
  25. #include    <egb.h>
  26. //#include    <file_dlg.h>
  27. //#include    <tifflib.h>
  28. #include    <msdos.cf>
  29. #include    <loader.h>
  30. #include    <math.h>
  31. #include    <io.h>
  32. //#include    <guidbg.h>
  33. //#include    <wgb.h>
  34. // ※ ここまでが平均的に使用されるヘッダ
  35.  
  36. #include    "..\ein\eintm.h"    // EIN(TM)関連ライブラリのヘッダ
  37.  
  38. #include    <pocket.h>            // このサンプルでのみ必要
  39.  
  40. #define    ERROR    (-1)
  41. #ifndef NOERR
  42.     #define    NOERR    (0)
  43. #endif
  44.  
  45. extern int    GV_apliLot;            // malloc用
  46.  
  47. extern char    fname[];            // 送受信ファイル名
  48.  
  49. extern char    irBuf[];            // IR送受信用バッファ
  50. extern char    repBuf[];            // IR送受信用リピートバッファ
  51.  
  52.  
  53. char    *termBuf = NULL;        // 送受信元データバッファ
  54. int        termBufSize = 0;        // 元データバッファサイズ(bytes)
  55. int        termSize = 0;            // 元データバッファ内データサイズ(bytes)
  56.  
  57. // バッファをpurge
  58. int        WL_purgeBuf()
  59. {
  60.     if ( termBuf != NULL ){
  61.         TL_freeMemory(termBuf, termBufSize);
  62.     }
  63.     termBuf = NULL;
  64.     termBufSize = 0;
  65.     termSize = 0;
  66.     return NOERR;
  67. }
  68.  
  69. // 元バッファをmalloc
  70. int        WL_mallocBuf( int size )
  71. {
  72.     if ( termSize > 0 ){
  73.         WL_purgeBuf();
  74.     }
  75.     if ( size < 1 ){
  76.         return ERROR;
  77.     }
  78.     size = ((size / 1024)+1) * 1024;
  79.     if ( (termBuf=TL_mallocMemory(GV_apliLot, size)) == NULL ){
  80.         #ifdef DEBUG
  81.         printf("WL_mallocBuf(%s): Can't malloc!\n", size);
  82.         #endif
  83.         return ERROR;
  84.     }
  85.     termBufSize = size;
  86.  
  87.     return NOERR;
  88. }
  89.  
  90. // 元バッファをshrink
  91. int        WL_shrinkBuf()
  92. {
  93.     int        osize, nsize;
  94.     char    *tbuf;
  95.  
  96.     if ( (termSize < 1) || (termBufSize < 1) ){
  97.         return ERROR;
  98.     }
  99.     osize = ((termBufSize / 1024)+1) * 1024;
  100.     nsize = ((termSize / 1024)+1) * 1024;
  101.     // 違いが1024byte未満なら縮めてもメリットが無い
  102.     if ( osize == nsize ){
  103.         return NOERR;
  104.     }
  105.     // ワークのメモリを取れなかった
  106.     if ( (tbuf=TL_mallocMemory(GV_apliLot, nsize)) == NULL ){
  107.         return NOERR;
  108.     }
  109.     #ifdef DEBUG
  110.     printf("WL_shrinkBuf() %d->%d\n", osize, nsize);
  111.     #endif
  112.     // ワークにバッファ内容を転送
  113.     memcpy( tbuf, termBuf, termSize );
  114.     // 古いバッファをpurge
  115.     TL_freeMemory(termBuf, termBufSize);
  116.     termBufSize = nsize;
  117.     termBuf = tbuf;
  118.  
  119.     return NOERR;
  120. }
  121.  
  122. // バッファ末尾に0x1aが無ければ追加する
  123. int        WL_putEOF()
  124. {
  125.     char    *dst;
  126.  
  127.     if ( termBuf == NULL ){
  128.         return ERROR;
  129.     }
  130.     dst = (char *)termBuf + termSize -1;
  131.     if ( dst[0] == 0x1a ){
  132.         #ifdef DEBUG
  133.         printf("WL_putEOF(): 0x1a already exist.\n");
  134.         #endif
  135.         return NOERR;
  136.     }
  137.     if ( termSize >= termBufSize ){
  138.         #ifdef DEBUG
  139.         printf("WL_putEOF(): Buffer size over.\n");
  140.         #endif
  141.         return ERROR;
  142.     }
  143.     // バッファ末尾に0x1aを追加
  144.     dst[1] = 0x1a;
  145.     termSize++;
  146.     return NOERR;
  147. }
  148.  
  149. // 元バッファに指定サイズ分のデータをIRバッファから追加転送
  150. int        WL_recBuf( int size )
  151. {
  152.     char        *dst, *src;
  153.     if ( termBuf == NULL ){
  154.         #ifdef DEBUG
  155.         printf("WL_recBuf(%s): No buf!\n", size);
  156.         #endif
  157.         return ERROR;
  158.     }
  159.     if ( size < 17 ){
  160.         #ifdef DEBUG
  161.         printf("WL_recBuf(%s): too short!\n", size);
  162.         #endif
  163.         return ERROR;
  164.     }
  165.     // ヘッダ(15byte)と末尾のチェックサム(2byte)を除いて転送
  166.     size -= 17;
  167.     // バッファを越える転送はしないように
  168.     if ( (termSize + size) > termBufSize ){
  169.         size = termBufSize - termSize;
  170.     }
  171.     if ( size < 1 ){
  172.         #ifdef DEBUG
  173.         printf("WL_recBuf(): overflow!\n");
  174.         #endif
  175.         return ERROR;
  176.     }
  177.     src = (char *)irBuf + 15;    // ヘッダ分をとばす
  178.     dst = (char *)termBuf + termSize;
  179.     memcpy( dst, src, size );
  180.     termSize += size;
  181.  
  182.     #ifdef DEBUG
  183.     printf("WL_recBuf(%x,%d)\n", dst,termSize);
  184.     #endif
  185.  
  186.     return NOERR;
  187. }
  188.  
  189. // 元バッファに指定サイズ分のデータをIRバッファから追加転送
  190. int        WL_recRBuf( int size )
  191. {
  192.     char        *dst, *src;
  193.     if ( termBuf == NULL ){
  194.         #ifdef DEBUG
  195.         printf("WL_recBuf(%s): No buf!\n", size);
  196.         #endif
  197.         return ERROR;
  198.     }
  199.     if ( size < 17 ){
  200.         #ifdef DEBUG
  201.         printf("WL_recBuf(%s): too short!\n", size);
  202.         #endif
  203.         return ERROR;
  204.     }
  205.     // ヘッダ(15byte)と末尾のチェックサム(2byte)を除いて転送
  206.     size -= 17;
  207.     // バッファを越える転送はしないように
  208.     if ( (termSize + size) > termBufSize ){
  209.         size = termBufSize - termSize;
  210.     }
  211.     if ( size < 1 ){
  212.         #ifdef DEBUG
  213.         printf("WL_recBuf(): overflow!\n");
  214.         #endif
  215.         return ERROR;
  216.     }
  217.     src = (char *)repBuf + 15;    // ヘッダ分をとばす
  218.     dst = (char *)termBuf + termSize;
  219.     memcpy( dst, src, size );
  220.     termSize += size;
  221.  
  222.     #ifdef DEBUG
  223.     printf("WL_recBuf(%x,%d)\n", dst,termSize);
  224.     #endif
  225.  
  226.     return NOERR;
  227. }
  228.  
  229. // IRバッファ送信準備
  230. int        WL_mkSendBuf( int flag )
  231. {
  232.     #define    IR_head_Len        (15)
  233.     #define    IR_head_BlNo    (8)
  234.     #define    IR_head_Size    (13)
  235.  
  236.     char    head[15]= {    0x00,  0x00,  0x00,  0x00,  0x00,  0x96,  0x81, 0x10,
  237.                         0x00,  0x00,  0x01,  0x40,  0x0fe, 0x00,  0x00 };
  238.  
  239.     static int    bufp, cnt;
  240.     char        *src, *dst;
  241.     int            i, sum, size;
  242.  
  243.     // お約束のErrorTrap
  244.     if ( termBuf==NULL || termSize < 1 ){
  245.         return -1;
  246.     }
  247.     // flag がFALSEなら転送条件を初期化する
  248.     if ( flag < 1 ){
  249.         bufp = 0;
  250.         cnt = 1;
  251.         return 0;
  252.     }
  253.     // バッファ終端なら何もしない
  254.     if ( termSize <= bufp ){
  255.         return 0;
  256.     }
  257.     // バッファを越える転送はしないように
  258.     size = 512;
  259.     if ( (bufp + size) > termSize ){
  260.         size = termSize - bufp;
  261.     }
  262.     // ヘッダを付ける
  263.     memcpy( irBuf, head, IR_head_Len );
  264.     // ブロック番号を設定する(size<512なら最後のブロックなのでFFFFに)
  265.     *(unsigned short *)( &irBuf[0] + IR_head_BlNo ) = (size == 512) ?cnt :0x0ffff;
  266.     // データサイズを設定する
  267.     *(unsigned short *)( &irBuf[0] + IR_head_Size ) = size;
  268.     // データを転送する
  269.     dst = irBuf + IR_head_Len;
  270.     src = termBuf + bufp;
  271.     memcpy( dst, src, size );
  272.     cnt++;
  273.     bufp += size;
  274.     // チェックサムを設定する
  275.     for( i=sum=0; i < size; i++ ){
  276.         sum += *( dst + i );
  277.     }
  278.     *(unsigned short *)(&irBuf[0] + IR_head_Len + size) = sum;
  279.  
  280.     return (IR_head_Len + size + 2);
  281. }
  282.  
  283. // 指定バッファの内容をセーブする
  284. int        WL_saveFile( char *buf, int size )
  285. {
  286.     FILE    *fp;
  287.     int        ret = ERROR;
  288.     
  289.     if ( (strlen(fname)< 1) || (buf==NULL) || (size<1) ){
  290.         return ret;
  291.     }
  292.     if ( (fp=EIN_fopen(fname,"wb")) == (FILE *)NULL ){
  293.         return ret;
  294.     }
  295.     if ( fwrite( buf, size, 1, fp ) > 0 ){
  296.         ret = NOERR;
  297.     }
  298.     fclose( fp ) ;
  299.     return ret;
  300. }
  301.  
  302. // 指定バッファの内容をポケットに入れる
  303. int        WL_savePocket( char *buf, int size )
  304. {
  305.     int        ret = ERROR;
  306.     if ( SCB_open()==NOERR ){
  307.         // まずポケットの内容をクリア
  308.         SCB_empty();
  309.         if ( SCB_write(SCBF_CSTR,buf,size) == size ){
  310.             SCB_seek(SCBF_CSTR, 0, SCBS_SET);
  311.             ret = NOERR;
  312.         }
  313.         SCB_close();
  314.     }
  315.     return ret;
  316. }
  317.  
  318. // ファイルの内容を指定バッファにロードする
  319. int        WL_loadFile( char *buf, int size )
  320. {
  321.     FILE    *fp;
  322.     int        ret = ERROR;
  323.     
  324.     if ( (strlen(fname)< 1) || (buf==NULL) || (size<1) ){
  325.         return ret;
  326.     }
  327.     if ( (fp=EIN_fopen(fname,"rb")) == (FILE *)NULL ){
  328.         return ret;
  329.     }
  330.     if (fread( buf, 1, size, fp ) == size){
  331.         ret = NOERR;
  332.     }
  333.     fclose( fp ) ;
  334.     return ret;
  335. }
  336.  
  337. // ポケットの内容を指定バッファ入れる
  338. int        WL_loadPocket( char *buf, int size )
  339. {
  340.     int        ret = ERROR;
  341.  
  342.     if ( SCB_open()==NOERR ){
  343.         if ( SCB_isFormatAvailable(SCBF_CSTR) > 0 ){
  344.             SCB_seek(SCBF_CSTR, 0, SCBS_SET);
  345.             /* データ終端まで読み込み */
  346.             if (SCB_read(SCBF_CSTR, buf, size) == size ){
  347.                 ret = NOERR;
  348.             }
  349.         }
  350.         SCB_close();
  351.     }
  352.     return ret;
  353. }
  354.  
  355. // ファイルサイズを得る
  356. int        WL_getFileSize()
  357. {
  358.     FILE    *fp;
  359.     int        size = -1;
  360.     
  361.     if ( strlen(fname)< 1 ){
  362.         return size;
  363.     }
  364.     if ( (fp=EIN_fopen(fname,"rb")) == (FILE *)NULL ){
  365.         return size;
  366.     }
  367.     if (fseek( fp, 0L, SEEK_END ) == 0){
  368.         size = ftell( fp );
  369.     }
  370.     fclose( fp ) ;
  371.     return size;
  372. }
  373.  
  374. // ポケットの内容のデータサイズを得る
  375. int        WL_getPocketSize()
  376. {
  377.     int        size = -1;
  378.  
  379.     if ( SCB_open()==NOERR ){
  380.         size = SCB_isFormatAvailable(SCBF_CSTR);
  381.         SCB_close();
  382.     }
  383.     return size;
  384. }
  385.  
  386.  
  387. // 元バッファのプレーンテキストから無地メモ形式へ変換
  388. // (`dsize'(byte) で別メモに分割する。dsize<1の時は分割しない)
  389. // (※実測では1037byteまではWizでも取り込めるみたいっす)
  390. int        WL_convText2Csv( int dsize )
  391. {
  392.     char    str_crlf[] = { 0x0d, 0x0a, 0 };
  393.     char    str_i[] = "\"i\",\"SCRT\",\"CLAS\",\"MEM1\",\"PRF1\",\"CLSC\"";
  394.     char    str_T[] = "\"T\",\"シークレット\",\"ファイル名\",\"メモ内容\",\"印字形式\",\"分類コード\"";
  395.     char    str_Dh[]= "\"D\",\" \",,\"";
  396.     char    str_Dt[]= "\",,\" \"";
  397.     char    str_quote[] = { 0x0d, 0x0a, 0x1a, 0 };
  398.  
  399.     char    *tmpBuf, *sp, *dp, *dp2;
  400.     int        i, d, len, rem, cnt, tsize;
  401.  
  402.     if ( (termBuf==NULL) || (termSize<1) ){
  403.         return ERROR;
  404.     }
  405.     
  406.     // 3倍のワークバッファを取っておく
  407.     tsize = ( ((termSize * 3) / 1024)+1) * 1024;
  408.     if ( (tmpBuf=TL_mallocMemory(GV_apliLot, tsize)) == NULL ){
  409.         #ifdef DEBUG
  410.         printf("WL_convText2Buf(%s): Can't malloc!\n", size);
  411.         #endif
  412.         return ERROR;
  413.     }
  414.     // まずヘッダその1を転送
  415.     strcpy( tmpBuf, str_i );
  416.     strcat( tmpBuf, str_crlf );
  417.     // まずヘッダその2を転送
  418.     strcat( tmpBuf, str_T );
  419.     strcat( tmpBuf, str_crlf );
  420.  
  421.     strcat( tmpBuf, str_Dh );
  422.     
  423.     sp = (char *)termBuf;
  424.     dp = (char *)tmpBuf + strlen( tmpBuf );
  425.     dp2= dp;
  426.     for ( i=0; i<termSize; i++, sp++ ){
  427.         d = *(unsigned char *)(sp);
  428.         len = (int)(dp - dp2);            // 現在の処理済文字数
  429.         switch ( d ){
  430.             // 改行記号(1bute目)の時
  431.             case 0x0d:
  432.                 // 頁先頭の時は改行は無視しないとタイトルが読めない(^^;)
  433.                 if ( len > 0 ){
  434.                     *(unsigned char *)(dp) = 0x1f;
  435.                     dp++;
  436.                 }
  437.                 break;
  438.             // 改行記号(2bute目)の時
  439.             case 0x0a:
  440.                 break;
  441.             // TAB記号の時
  442.             case 0x09:
  443.                 // 頁先頭のTABは無視しないとタイトルが読めない(^^;)
  444.                 if ( len > 0 ){
  445.                     *(unsigned char *)(dp)= 0;
  446.                     strcat( tmpBuf, "    " );
  447.                     dp = (char *)tmpBuf + strlen( tmpBuf );
  448.                 }
  449.                 break;
  450.             // 特殊文字の時
  451.             case 0x1a:
  452.                 break;
  453.             // 改頁記号の時
  454.             case 0x0c:
  455.                 // 頁先頭の時は改頁は無視しないと無駄(^^;)
  456.                 if ( len > 0 ){
  457.                     // 行を変える
  458.                     *(unsigned char *)(dp)= 0;
  459.                     strcat( tmpBuf, str_Dt );
  460.                     strcat( tmpBuf, str_crlf );
  461.                     strcat( tmpBuf, str_Dh );
  462.                     dp = (char *)tmpBuf + strlen( tmpBuf );
  463.                     dp2= dp;
  464.                 }
  465.                 break;
  466.             // `"'の時
  467.             case 0x22:
  468.                 *(unsigned char *)(dp)= 0xde;    // `゙'
  469.                 dp++;
  470.                 break;
  471.             // `,'の時
  472.             case 0x2c:
  473.                 *(unsigned char *)(dp)= 0x2e;    // `.'
  474.                 dp++;
  475.                 break;
  476.             // 通常の文字の場合
  477.             default:
  478.                 *(unsigned char *)(dp)= d;
  479.                 dp++;
  480.                 break;
  481.         }
  482.         // 現在の総文字数をチェック
  483.         rem = sp - (char *)termBuf;        // 残り文字数
  484.         len = (int)(dp - dp2);            // 現在の処理済文字数
  485.         if ( (dsize > 0) && ((len + rem) > dsize) ){
  486.             len = (int)(dp - dp2);
  487.             if ( d==0x0d || d==0x0a ){
  488.                 cnt = 160;
  489.             } else {
  490.                 cnt = 80;
  491.                 // 漢字1byte目だったら優先(泣き別れ防止)
  492.                 if (((d)>0x080 && (d)<0x0A0)||((d)>0xDF && (d)<0x0FD)){
  493.                     cnt--;
  494.                 }
  495.             }
  496.             if ( (len + cnt) > dsize ){
  497.                 // 行を変える
  498.                 *(unsigned char *)(dp)= 0;
  499.                 strcat( tmpBuf, str_Dt );
  500.                 strcat( tmpBuf, str_crlf );
  501.                 strcat( tmpBuf, str_Dh );
  502.                 dp = (char *)tmpBuf + strlen( tmpBuf );
  503.                 dp2= dp;
  504.             }
  505.         }
  506.     }
  507.     *(unsigned char *)(dp) = 0;
  508.     
  509.     strcat( tmpBuf, str_Dt );
  510.     strcat( tmpBuf, str_quote );
  511.     
  512.     // 古いバッファをpurge
  513.     TL_freeMemory(termBuf, termBufSize);
  514.     
  515.     termBufSize = tsize;
  516.     termSize = strlen(tmpBuf);
  517.     termBuf = tmpBuf;
  518.     #ifdef DEBUG
  519.     printf("WL_convText2CSV(): %x  %d\n", termBuf, termSize);
  520.     #endif
  521.  
  522.     #ifdef DEBUG
  523.     FILE    *fp;
  524.     if ( (fp=EIN_fopen("g:text2csv.$$$","wb")) != (FILE *)NULL ){
  525.         fwrite( termBuf, termSize, 1, fp );
  526.     }
  527.     fclose( fp );
  528.     #endif
  529.  
  530.     return NOERR;
  531. }
  532.  
  533. // "MEM1" フィールドの位置を取得
  534. // (※データエリア末尾には必ず`0x1a'を入れておくこと)
  535. int        WL_countCsvField( char *sp )
  536. {
  537.     int        flag, mcnt;
  538.  
  539.     // "MEM1" フィールドの位置を取得
  540.     for ( flag=0, mcnt=0; flag==0; sp++ ){
  541.         switch ( *(unsigned char *)(sp) ){
  542.             // `,'の時
  543.             case 0x2c:
  544.                 // まずカウントアップ
  545.                 mcnt++;
  546. //                printf("+");
  547.                 // `,"MEM1"'か? (※もうちょっとエレガントに書きたいものだ)
  548.                 if ( *(unsigned char *)(sp +1) == 0x22  ){    // `"'
  549.                     if ( *(unsigned char *)(sp +2) == 'M' ){
  550.                         if ( *(unsigned char *)(sp +3) == 'E' ){
  551.                             if ( *(unsigned char *)(sp +4) == 'M' ){
  552.                                 if ( *(unsigned char *)(sp +5) == '1' ){
  553.                                     if ( *(unsigned char *)(sp +6) == 0x22 ){
  554.                                         flag++;
  555.                                     }
  556.                                 }
  557.                             }
  558.                         }
  559.                     }
  560.                 }
  561.                 break;
  562.             // 0x1aの時
  563.             case 0x1a:
  564.                 mcnt=-1;
  565.                 flag++;
  566.                 break;
  567.             // 通常の文字の場合
  568.             default:
  569.                 break;
  570.         }
  571.     }
  572.     return mcnt;
  573. }
  574.  
  575. // (※データエリア末尾には必ず`0x1a'を入れておくこと)
  576. char    *WL_searchCsvField( char *sp, int mcnt )
  577. {
  578.     int        flag, cnt;
  579.  
  580. nextline:
  581.     // まず `\n"M"' を探す
  582.     for ( flag=0; flag==0; sp++ ){
  583.         switch ( *(unsigned char *)(sp) ){
  584.             // `\n'の時
  585.             case 0x0a:
  586.                 // `\n"M"'か? (※もうちょっとエレガントに書きたいものだ)
  587.                 if ( *(unsigned char *)(sp +1) == 0x22  ){    // `"'
  588.                     if ( *(unsigned char *)(sp +2) == 'D' ){
  589.                         if ( *(unsigned char *)(sp +3) == 0x22 ){
  590.                             flag=1;
  591.                         }
  592.                     }
  593.                 }
  594.                 break;
  595.             // 0x1aの時
  596.             case 0x1a:
  597.                 flag=-1;
  598.                 break;
  599.             // 通常の文字の場合
  600.             default:
  601.                 break;
  602.         }
  603.     }
  604.     // バッファ末まで来てしまった
  605.     if ( flag < 0 ){
  606.         return NULL;
  607.     }
  608.     // "MEM1" フィールドの位置まで飛ばす
  609.     for ( flag=0, cnt=0; flag==0; sp++ ){
  610.         switch ( *(unsigned char *)(sp) ){
  611.             // `,'の時
  612.             case 0x2c:
  613.                 // まずカウントアップ
  614.                 cnt++;
  615.                 if ( cnt == mcnt ){
  616.                     flag = 1;
  617.                 }
  618.                 break;
  619.             // \nの時
  620.             case 0x0a:
  621.                 goto nextline;
  622.             // 0x1aの時
  623.             case 0x1a:
  624.                 flag=-1;
  625.                 break;
  626.             // 通常の文字の場合
  627.             default:
  628.                 break;
  629.         }
  630.     }
  631.     // バッファ末まで来てしまった
  632.     if ( flag < 0 ){
  633.         return NULL;
  634.     }
  635.     return sp;
  636. }
  637.  
  638. // 元バッファの無地メモ形式からプレーンテキストへ変換
  639. int        WL_convCsv2Text()
  640. {
  641.     char    *tmpBuf, *sp, *dp, *sp2;
  642.     int        mcnt, flag, flag2, d, d2, tsize, page;
  643.  
  644.     // お約束のErrorTrap
  645.     if ( (termBuf==NULL) || (termSize<1) ){
  646.         return ERROR;
  647.     }
  648.     // CSVでなかったらERROR (バッファ先頭から `"i",' の文字列と照合)
  649.     if ( termBuf[0]!='"' || (termBuf[1]!='i' && termBuf[1]!='I') ||
  650.          termBuf[2]!='"' || termBuf[3]!=',' ){
  651.         return ERROR;
  652.     }
  653.     sp = (char *)termBuf;
  654.     // まず "MEM1" フィールドの位置を取得
  655.     mcnt = WL_countCsvField( sp );
  656.     #ifdef DEBUG
  657.     printf("WL_countCsvField( %x ) = %d\n", sp, mcnt);
  658.     #endif
  659.  
  660.     // `,"MEM1"'フィールドが無かったので何もせず終了
  661.     if ( mcnt < 0 ){
  662.         return ERROR;
  663.     }
  664.     // とりあえず2倍の容量のワークバッファを取っておく
  665.     tsize = ( ((termSize * 2) / 1024)+1) * 1024;
  666.     if ( (tmpBuf=TL_mallocMemory(GV_apliLot, tsize)) == NULL ){
  667.         #ifdef DEBUG
  668.         printf("WL_convText2Buf(%s): Can't malloc!\n", tsize);
  669.         #endif
  670.         return ERROR;
  671.     }
  672.     dp = (char *)tmpBuf;
  673.  
  674.     for ( page=0,flag=0; flag==0; ){
  675.         sp2 = WL_searchCsvField( sp, mcnt );
  676.         #ifdef DEBUG
  677.         printf("WL_searchCsvField( %x, %d ) = %x\n", sp, mcnt, sp2);
  678.         #endif
  679.         // フィールドが有ったなら
  680.         if ( sp2 != NULL ){
  681.             sp = sp2;
  682.             // ちゃんと `"'で始まっているなら
  683.             if ( *(unsigned char *)(sp) == 0x22 ){
  684.                 sp++;
  685.                 // 二行目からは改頁を入れる
  686.                 if ( page>0 ){
  687.                     *(unsigned char *)(dp++) = 0x0c;
  688.                 }
  689.                 page++;
  690.                 // フィールド末までワークバッファに転送
  691.                 for ( flag2=0; flag2==0; sp++ ){
  692.                     d = *(unsigned char *)(sp);
  693.                     switch ( d ){
  694.                         // 改行記号の時
  695.                         case 0x1f:
  696.                             *(unsigned char *)(dp++) = 0x0d;
  697.                             *(unsigned char *)(dp++) = 0x0a;
  698.                             break;
  699.                         // 2byte半角英数字の時(EB9F~EBFC)
  700.                         case 0x0eb:
  701.                             d2 = *(unsigned char *)(++sp);
  702.                             if ( d2==0x9f ){                        // `>'
  703.                                 *(unsigned char *)(dp++)= '>';
  704.                             } else if ( d2==0xa0 ){                    // `<'
  705.                                 *(unsigned char *)(dp++)= '<';
  706.                             } else if ( d2>=0x0ae && d2<=0x0b7 ){    // `0'~`9'
  707.                                 *(unsigned char *)(dp++)= d2 - 0x0ae + '0';
  708.                             } else if ( d2>=0x0b8 && d2<=0x0be ){    // `10'~`16'
  709.                                 *(unsigned char *)(dp++)= '1';
  710.                                 *(unsigned char *)(dp++)= d2 - 0x0b8 + '0';
  711.                             } else if ( d2>=0x0bf && d2<=0x0d8 ){    // `A'~`Z'
  712.                                 *(unsigned char *)(dp++)= d2 - 0x0bf + 'A';
  713.                             } else if ( d2>=0x0df && d2<=0x0f8 ){    // `a'~`z'
  714.                                 *(unsigned char *)(dp++)= d2 - 0x0df + 'a';
  715.                             } else if ( d2==0xd9 ){                    // `※'
  716.                                 *(unsigned char *)(dp++)= 0x81;
  717.                                 *(unsigned char *)(dp++)= 0x0a6;
  718.                             } else if ( d2>=0x0da && d2<=0x0dd ){    // `ヽヾゝ〃'
  719.                                 *(unsigned char *)(dp++)= 0x81;
  720.                                 *(unsigned char *)(dp++)= d2 - (0x0da - 0x52);
  721.                             } else if ( d2==0x0f9 ){                // `〒'
  722.                                 *(unsigned char *)(dp++)= 0x81;
  723.                                 *(unsigned char *)(dp++)= 0x0a7;
  724.                             } else if ( d2>=0x0fa && d2<=0x0fc ){    // `仝々〆'
  725.                                 *(unsigned char *)(dp++)= 0x81;
  726.                                 *(unsigned char *)(dp++)= d2 - (0x0fa - 0x56);
  727.                             } else {                                // その他
  728.                                 *(unsigned char *)(dp++)= d;
  729.                                 *(unsigned char *)(dp++)= d2;
  730.                             }
  731.                             break;
  732.                         // 2byte半角かな文字の時(EC40~ECF5)
  733.                         case 0x0ec:
  734.                             d2 = *(unsigned char *)(++sp);
  735.                             if ( d2>=0x40 && d2<=0x7e ){            // `ぁ'~`み'
  736.                                 *(unsigned char *)(dp++)= 0x82;
  737.                                 *(unsigned char *)(dp++)= d2 + (0x9f - 0x40);
  738.                             } else if ( d2>=0x80 && d2<=0x93 ){        // `む'~`ん'
  739.                                 *(unsigned char *)(dp++)= 0x82;
  740.                                 *(unsigned char *)(dp++)= d2 + (0x0de - 0x80);
  741.                             } else if ( d2>=0x9f && d2<=0x0dd ){    // `ァ'~`ミ'
  742.                                 *(unsigned char *)(dp++)= 0x83;
  743.                                 *(unsigned char *)(dp++)= d2 - (0x09f - 0x40);
  744.                             } else if ( d2>=0x0de && d2<=0x0f4 ){    // `ム'~`ヶ'
  745.                                 *(unsigned char *)(dp++)= 0x83;
  746.                                 *(unsigned char *)(dp++)= d2 - (0x0de - 0x80);
  747.                             } else if ( d2==0x0f5 ){                // `ー'
  748.                                 *(unsigned char *)(dp++)= 0x81;
  749.                                 *(unsigned char *)(dp++)= 0x5b;
  750.                             } else {                                // その他
  751.                                 *(unsigned char *)(dp++)= d;
  752.                                 *(unsigned char *)(dp++)= d2;
  753.                             }
  754.                             break;
  755.  
  756.                         // `"'の時
  757.                         case 0x22:
  758.                             d = *(unsigned char *)(sp +1);
  759.                             // `,'か`\n' か 0x1a なら終了
  760.                             if ( d==0x2c || d==0x0d || d==0x1a ){
  761.                                 flag2=1;
  762.                                 if ( d==0x1a ){
  763.                                     flag=1;
  764.                                 }
  765.                             } else {
  766.                                 *(unsigned char *)(dp)= d;
  767.                                 dp++;
  768.                             }
  769.                             break;
  770.                         // 通常の文字の場合
  771.                         default:
  772.                             *(unsigned char *)(dp++)= d;
  773.                             // 漢字の先頭バイトだったら次の文字も
  774.                             if (((d)>0x080 && (d)<0x0A0)||((d)>0xDF && (d)<0x0FD)){
  775.                                 d2 = *(unsigned char *)(sp+1);
  776.                                 if ( d2!=0 && d2!=0x22 ){
  777.                                     *(unsigned char *)(dp++)= d2;
  778.                                     sp++;
  779.                                 }
  780.                             }
  781.                             break;
  782.                     }
  783.                 }
  784.                 *(unsigned char *)(dp) = 0;
  785.             }
  786.         } else {
  787.             // バッファ末なので終了
  788.             flag = 1;
  789.         }
  790.     }
  791.     // (strlenで文字数を計る為)
  792.     *(unsigned char *)(dp) = 0;
  793.     
  794.     // 古いバッファをpurge
  795.     TL_freeMemory(termBuf, termBufSize);
  796.     
  797.     termBufSize = tsize;
  798.     termSize = strlen(tmpBuf);
  799.     termBuf = tmpBuf;
  800.     #ifdef DEBUG
  801.     printf("WL_convCsv2Text(): %x  %d\n", termBuf, termSize);
  802.     #endif
  803.  
  804.     #ifdef DEBUG
  805.     FILE    *fp;
  806.     if ( (fp=EIN_fopen("g:csv2text.$$$","wb")) != (FILE *)NULL ){
  807.         fwrite( termBuf, termSize, 1, fp );
  808.     }
  809.     fclose( fp );
  810.     #endif
  811.  
  812.     return NOERR;
  813. }
  814.